#include <iostream>
#include <string>
#include <unistd.h>
#include <vector>
#include "Thread.hpp"

using namespace ThreadMoudle;

// 模拟抢票 10000张
int tickets = 10000;

void route(const std::string& name)
{
    while(true)
    {
        // 有票才抢
        if(tickets > 0)
        {
            usleep(1000); // 1ms -> 抢票花费时间
            printf("who: %s, get a ticket: %d\n", name.c_str(), tickets);
            tickets--;
        }
        else
        {
            break;
        }
    }
}

int main()
{
    // 1.创建4个线程
    Thread t1("thread-1",route);
    Thread t2("thread-2",route);
    Thread t3("thread-3",route);
    Thread t4("thread-4",route);

    // 2.启动4个线程
    t1.Start();
    t2.Start();
    t3.Start();
    t4.Start();

    // 3.终止4个线程
    t1.Join();
    t2.Join();
    t3.Join();
    t4.Join();

    return 0;
}

// void Print(const std::string &name)
// {
//     int cnt = 1;
//     while (true)
//     {
//         std::cout << name << " is running,cnt: " << cnt++ << std::endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     Thread t("thread-1", Print);
//     t.Start();
//     sleep(1); // 等待一秒，因为线程执行顺序不确定，可能主线程后执行
//     std::cout << t.Name() << ",status: " << t.Status() << std::endl;
//     sleep(10);

//     t.Stop();
//     sleep(1);
//     std::cout << t.Name() << ",status: " << t.Status() << std::endl;

//     t.Join();
//     std::cout << t.Name() << ",status: " << t.Status() << std::endl;
//     return 0;
// }

// const int gnum = 10;

// int main()
// {
//     std::vector<Thread> threads;
//     // 创建线程
//     for(int i=0;i<gnum;i++)
//     {
//         std::string name = "thread" + std::to_string(i+1);
//         threads.emplace_back(name,Print);
//         sleep(1);
//     }

//     // 统一启动
//     for(auto& thread : threads)
//     {
//         thread.Start();
//     }

//     sleep(3);

//     // 统一停止
//     for(auto& thread : threads)
//     {
//         thread.Stop();
//     }

//     // 统一等待
//     for(auto& thread : threads)
//     {
//         thread.Join();
//     }
//     return 0;
// }